package ar.edu.unrn.lia.bean;

import java.io.Serializable;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.persistence.OptimisticLockException;
import javax.persistence.PersistenceException;

import org.primefaces.event.SelectEvent;

import ar.edu.unrn.lia.bean.datamodel.LazyCiudadDataModel;
import ar.edu.unrn.lia.model.Ciudad;
import ar.edu.unrn.lia.service.CiudadService;

@ManagedBean(name = "ciudadBean")
@ViewScoped
public class CiudadBean extends GenericBean<Ciudad> implements Serializable {

	private static final long serialVersionUID = 1L;

	@ManagedProperty(value = "#{ciudadService}")
	CiudadService entityService;

	public List<Ciudad> getCiudades() {
		return entityService.getAll();
	}

	public String create() {
		setEntity(new Ciudad());
		return REDIRECT_CREATE;
	}

	public void onRowSelect(SelectEvent event) {
		agregarMensaje(FacesMessage.SEVERITY_INFO, "Ciudad Seleccionada: ",
				((Ciudad) event.getObject()).getDescripcion());
	}

	public String update() {
		try {
			if (getEntity().getId() == null) {

				entityService.save(getEntity());
				mensajeFlash("Crear Ciudad", "Operación realizada con exito.");
			} else {
				entityService.update(getEntity());
				mensajeFlash("Modificar Ciudad",
						"Operación realizada con exito.");
			}

			return REDIRECT_SEARCH;
		} catch (OptimisticLockException e) {
			agregarMensaje(FacesMessage.SEVERITY_ERROR, "Bloqueo",
					"Alquien modificó esta Cuidad, reconsulte.");
			return null;
		} catch (Exception e) {
			agregarMensaje(FacesMessage.SEVERITY_ERROR, "Error", e.getMessage());
			return null;
		}
	}

	public String delete(Ciudad entity) {
		try {
			entityService.delete(entity);
			mensajeFlash("Eliminar Ciudad", "Operación realizada con exito.");
			return REDIRECT_SEARCH;
		} catch (OptimisticLockException e) {
			agregarMensaje(FacesMessage.SEVERITY_ERROR, "Bloqueo",
					"Alquien modificó esta Ciudad, reconsulte.");
			return null;
		} catch (PersistenceException e) {
			agregarMensaje(FacesMessage.SEVERITY_ERROR, "Eliminar Ciudad",
					"No se puede eliminar. La Ciudad esta asociada a un Barrio.");
			return null;
		} catch (Exception e) {
			agregarMensaje(FacesMessage.SEVERITY_ERROR, "Eliminar Ciudad",
					e.getMessage());
			return null;
		}
	}

	@PostConstruct
	public void init() {
		setModelLazy(new LazyCiudadDataModel(entityService));
	}

	public void inicio() {
		if (!FacesContext.getCurrentInstance().isPostback()) {
			if (getId() != null) {
				setEntity(entityService.getEntityById(getId()));
			} else {
				setEntity(new Ciudad());
			}
		}
	}

	public CiudadService getEntityService() {
		return entityService;
	}

	public void setEntityService(CiudadService entityService) {
		this.entityService = entityService;
	}

}
